home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / joke / iroojon / iroojon.bas < prev    next >
BASIC Source File  |  1994-11-16  |  32KB  |  1,004 lines

  1. 10 '
  2. 20 '====================================================================
  3. 30 '                 >>>タウンズ 色ーヂョン v.0.0<<<
  4. 40 '====================================================================
  5. 50 '
  6. 60 '                  ---このプログラムの機能---
  7. 70 ' ・ランダムな色で,"ノイズ画面","タイル画面","オープン画面"を描画する.
  8. 80 ' ・描画した画面を任意にセーブできる.(TIF形式ファイル.)
  9. 90 ' ・色情報からランダムな和音を生成し,発音する.
  10. 100 ' ・上記を,16色,256色,32768色(低解像度),の各モード画面で実行する.
  11. 110 '
  12. 120 '                       ---使い方---
  13. 130 ' ・このプログラムは,Towns システムソフトウェア,または,F-BASIC386 の"V2.1以上"で
  14. 140 '  動作します.(将来に関しては断言できないが ^^;)
  15. 150 ' ・FM音源ファイル"FMP.FMB"を,実行プログラムと同じディレクトリに置くか,または,
  16. 160 '  F-BASIC386 V2.1L10のCD-ROMを用意して,FD等から起動する.
  17. 170 '  (BASICの他のレベルに関しては未確認.)
  18. 180 ' ・操作するにはマウスが,セーブする場合はキーボードが必要です.(注:セーブ画面
  19. 190 '  からはマウスだけでは脱出できない.今後の課題です. T_T)
  20. 200 ' ・メニュー画面以外では,大抵の場合(^^;)右クリックでキャンセルできます.
  21. 210 '
  22. 220 '                       ---注意点---
  23. 230 ' ・上記にもあるように,セ-ブ画面から脱出するには,"マウス&キーボードのセット"が
  24. 240 '  必要. ぢゃないとリセットしかない.(T_T)
  25. 250 ' ・32K色のノイズ画面では,マウスの割り込みを受け付けず,キャンセルできなかったり,
  26. 260 '  和音を鳴らしてる場合発音が変になったりすることがあります.(T_T)
  27. 270 '  この場合,何回か右クリックを続けると復旧するようです.
  28. 280 ' ・ノイズ画面で,音を鳴らしながら何回かループさせると,発音のタイミングを
  29. 290 '  待ってから描画する,とゆー現象がありました.まあ,ノイズをループさせるの
  30. 300 '  ってあんまり意味もないので,このままにしておきます.(^^;)(もしか
  31. 310 '  すると,対処できるかも.but 〆切が・・・.)
  32. 320 '  (↑対処できたと思います.何ライン毎に発音させるかが問題だったらしい.)
  33. 330 '
  34. 340 ' *このソースの最後に,今回のプログラミングで気付いたことがまとめて有ります.
  35. 350 '  私と同様なプログラミング初心者には面白いかもしれません.
  36. 360 '
  37. 370 '
  38. 380 ' ・・・完成日時:1994 8.14(SUN)・・・
  39. 390 ' ・・・作者:かんの-はなぢ・・・
  40. 400 '
  41. 410 '********************************************************************
  42. 420 '
  43. 430 '
  44. 440 '
  45. 450 '======================START OF PROGRAM==============================
  46. 460 '
  47. 470 ON ERROR GOTO *ERR_TRAP
  48. 480 DEFINT A-Z : RANDOMIZE TIME
  49. 490 '
  50. 500 LOAD_FMB_FLG=1   '音源ファイル読み込みエラー,判定用フラグ.(エラートラップで使う.)
  51. 510 LOAD@ "FMP.FMB"
  52. 520 LOAD_FMB_FLG=0
  53. 530 '
  54. 540 X=164 : Y=128              '基準座標
  55. 550 STR_X=64 : STR_Y=16        '文字列(の枠)の縦横の幅
  56. 560 '
  57. 570 '***以下の4つの配列は,現在のメニューのセレクト状態を保存する.***
  58. 580 DIM SCRN_MODE(2)         '画面モード選択用配列
  59. 590 DIM DRW_MODE(2)          '描画スタイル   〃
  60. 600 DIM LOOP_MODE(1)         '繰り返し描画するかどうかの選択用配列
  61. 610 DIM SND_MODE(1)          'サウンドモード選択用配列
  62. 620 '
  63. 630 '***以下の4つの配列は,マウスの選択情報を一時的に入れておく.***
  64. 640 DIM GET_SCRN_MODE(2)
  65. 650 DIM GET_DRW_MODE(2)
  66. 660 DIM GET_LOOP_MODE(1)
  67. 670 DIM GET_SND_MODE(1)
  68. 680 '
  69. 690 '***メニューのセレクト状態の初期化***
  70. 700 SCRN_MODE(0)=1            '16色
  71. 710  DRW_MODE(0)=1            'ノイズを描画
  72. 720 LOOP_MODE(0)=1            '繰り返して描画する
  73. 730  SND_MODE(0)=1            'コードを鳴らす
  74. 740 '
  75. 750 SCREEN@ 0 : MOUSE 0
  76. 760 '
  77. 770 '
  78. 780 '************プログラム全体の流れは以下のようになっている.***********
  79. 790 '
  80. 800 GOSUB *SETTING_MENU      'メニュー描画
  81. 810 GOSUB *MAIN_GRFC         '実行画面
  82. 820 GOSUB *SELECT_SAVE       'セーブするか,しないか.
  83. 830 GOSUB *ENDING
  84. 840 *ALL_END
  85. 850 PLAY OFF : MOUSE 5
  86. 860 END
  87. 870 '
  88. 880 '********************ここまで. 以下はサブルーチン.*******************
  89. 890 '
  90. 900 '
  91. 910 '
  92. 920 '********************************************************************
  93. 930 '
  94. 940 '
  95. 950 '
  96. 960 *SETTING_MENU
  97. 970 SCREEN 1,1,2,1 : GOSUB *INIT_MENU_PLT : COLOR ,0,7
  98. 980 'ページ1に描画する.あとでSCREEN 0を使うので,*MAIN_GRFCはページ0に描画
  99. 990 'して,消されるのを防ぐ.でも,別にここで2画面にしなくても・・・と気づいた
  100. 1000 'が,面倒なので,このままにしときます(T_T).
  101. 1010 '↑結局,ページ0を消す仕様になりました(T_T T_T).
  102. 1020 '
  103. 1030 FOR I=0 TO 13   'メニューの枠(?)の描画.
  104. 1040   LINE (I*3,I*3)-(639-I*3,479-I*3),PSET,%(I+1),B
  105. 1050 NEXT I
  106. 1060 '
  107. 1070 SYMBOL (X,64),"タウンズ  ",2,3,,,,49        '太文字,オーバー&アンダーライン.
  108. 1080 SYMBOL STEP (160,0),"色",2,3,%1,,,1         'ランダム色で太文字.
  109. 1090 SYMBOL STEP (32,0),"ーヂョン",2,3,7,,,49
  110. 1100 '
  111. 1110 SYMBOL (X+STR_X,64+STR_Y*4)," 16色    256色   32k色",1,1
  112. 1120 SYMBOL STEP (0,STR_Y*2)," ノイズ  タイル オープン",1,1
  113. 1130 SYMBOL STEP (0,STR_Y*2)," ループ         シングル",1,1
  114. 1140 SYMBOL STEP (0,STR_Y*2),"SOUND ON        SOUND OFF",1,1
  115. 1150 SYMBOL STEP (-STR_X,STR_Y*4),"GO!             EXIT",2,2
  116. 1160 '
  117. 1170 GOSUB *SET_SCRN_MODE '現在セレクトされている項目の枠を描画する.以下同様.
  118. 1180 GOSUB *SET_DRW_MODE
  119. 1190 GOSUB *SET_LOOP_MODE
  120. 1200 GOSUB *SET_SND_MODE
  121. 1210 '
  122. 1220 '---メニュー実行部分---
  123. 1230 MOUSE 0,1 : MOUSE 1,X,Y,1 : PLAY OFF: PLAY ON
  124. 1240 END_OF_SELECT_FLG=0     'メニュー選択完了を調べるフラグ
  125. 1250 '
  126. 1260 GOSUB *M_BGM_SET   'BGMの準備.
  127. 1270 '
  128. 1280 WHILE END_OF_SELECT_FLG=0   'フラグが立つまでループ
  129. 1290 '
  130. 1300   WHILE MOUSE(3,0)=0        '左クリックされるまで待つ(WHILE MOUSE(2,0)
  131. 1310     WHILE PLAY(0)=0         'でも良いが,カーソルが,ちらつく.)
  132. 1320       GOSUB *M_BGM
  133. 1330     WEND
  134. 1340   WEND
  135. 1350 '
  136. 1360 M_X=MOUSE(4,0) : M_Y=MOUSE(5,0)   '左クリックされた座標を得る
  137. 1370 '
  138. 1380 'SCRN_MODEの選択
  139. 1390     WHILE Y<=M_Y AND M_Y<=Y+STR_Y
  140. 1400         GOSUB *CHK_SLCTD_SCRN             'どの項目がクリックされたのか.
  141. 1410         GOSUB *SET_SCRN_MODE : GOTO 1730  '枠の描画 : ここの"GOTO" は
  142. 1420     WEND                                   '(C言語の)"BREAK"に相当.
  143. 1430                                            '↑M_Yが変化しないので
  144. 1440 'DRW_MODEの選択                               WHILEループから出られない
  145. 1450     WHILE Y+STR_Y*2<=M_Y AND M_Y<=Y+STR_Y*3
  146. 1460         GOSUB *CHK_SLCTD_DRW
  147. 1470         GOSUB *SET_DRW_MODE : GOTO 1730
  148. 1480     WEND
  149. 1490 '
  150. 1500 'LOOP_MODEの選択
  151. 1510     WHILE Y+STR_Y*4<=M_Y AND M_Y<=Y+STR_Y*5
  152. 1520         GOSUB *CHK_SLCTD_LOOP
  153. 1530         GOSUB *SET_LOOP_MODE : GOTO 1730
  154. 1540     WEND
  155. 1550 '
  156. 1560 'SND_MODEの選択
  157. 1570     WHILE Y+STR_Y*6<=M_Y AND M_Y<=Y+STR_Y*7
  158. 1580         GOSUB *CHK_SLCTD_SND
  159. 1590         GOSUB *SET_SND_MODE : GOTO 1730
  160. 1600     WEND
  161. 1610 '
  162. 1620 '選択完了?
  163. 1630     WHILE Y+STR_Y*10<=M_Y AND M_Y<=Y+STR_Y*12
  164. 1640         WHILE X<=M_X AND M_X<=X+48                      'GO!
  165. 1650            END_OF_SELECT_FLG=1 : GOTO 1730
  166. 1660         WEND
  167. 1670 '
  168. 1680         WHILE X+48+STR_X*3+16<=M_X AND M_X<=X+48+STR_X*4+16   'EXIT!
  169. 1690            END_OF_SELECT_FLG=2 : GOTO 1730
  170. 1700         WEND
  171. 1710     M_X=0 : M_Y=0  'これが無いとループから出られなくなる場合がある(T_T)
  172. 1720     WEND
  173. 1730 M_X=0 : M_Y=0   '念のため(^^;)
  174. 1740 WEND   '---メニュー実行部分のループの終了---
  175. 1750 '
  176. 1760 IF END_OF_SELECT_FLG=1 THEN
  177. 1770     RETURN
  178. 1780 ELSE IF END_OF_SELECT_FLG=2 THEN
  179. 1790     GOTO 830   '*ENDINGへ.
  180. 1800 ENDIF
  181. 1810 RETURN
  182. 1820 '*****THE END OF *SETTING_MENU*****
  183. 1830 '
  184. 1840 '*****以下は*SETTING_MENUから呼び出すサブルーチン*****
  185. 1850 '
  186. 1860 '---SCRN_MODE ルーチン---
  187. 1870 '
  188. 1880 *CHK_SLCTD_SCRN
  189. 1890 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2-1) THEN
  190. 1900     GET_SCRN_MODE(0)=1
  191. 1910 ELSE IF (X+STR_X*2)<=M_X AND M_X<=(X+STR_X*3-1) THEN
  192. 1920     GET_SCRN_MODE(1)=1
  193. 1930 ELSE IF (X+STR_X*3)<=M_X AND M_X<=(X+STR_X*4) THEN
  194. 1940     GET_SCRN_MODE(2)=1
  195. 1950 ELSE 
  196. 1960     RETURN
  197. 1970 ENDIF
  198. 1980 GOSUB *SCRN_FLGS_RESET        '現在の選択状態をセットする
  199. 1990 '
  200. 2000 FOR I=0 TO 2                  'フラグをゼロクリア
  201. 2010     GET_SCRN_MODE(I)=0
  202. 2020 NEXT I
  203. 2030 RETURN
  204. 2040 '
  205. 2050 '
  206. 2060 *SCRN_FLGS_RESET   '前回の状態と照合する.
  207. 2070 FOR I=0 TO 2
  208. 2080   IF SCRN_MODE(I)=1 AND GET_SCRN_MODE(I)=0 THEN
  209. 2090      SCRN_MODE(I)=0 : GOTO 2120
  210. 2100   ENDIF
  211. 2110    SCRN_MODE(I)=(SCRN_MODE(I) OR GET_SCRN_MODE(I))
  212. 2120 NEXT I
  213. 2130 RETURN  '---↑(1 OR 0)=1なので,それを予防する.他の場合はOK・・・のハズ---
  214. 2140 '
  215. 2150 '
  216. 2160 *SET_SCRN_MODE
  217. 2170 FOR I=0 TO 2
  218. 2180   IF SCRN_MODE(I)=1 THEN
  219. 2190     LINE (X+STR_X+STR_X*I,Y)-STEP(STR_X-1,STR_Y),PSET,,B
  220. 2200   ELSE IF SCRN_MODE(I)=0 THEN
  221. 2210     LINE (X+STR_X+STR_X*I,Y)-STEP(STR_X-1,STR_Y),PRESET,,B
  222. 2220   ENDIF
  223. 2230 NEXT I
  224. 2240 RETURN
  225. 2250 '
  226. 2260 '
  227. 2270 '---DRW_MODE ルーチン---
  228. 2280 '
  229. 2290 *CHK_SLCTD_DRW
  230. 2300 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2) THEN
  231. 2310     GET_DRW_MODE(0)=1
  232. 2320 ELSE IF (X+STR_X*2)<M_X AND M_X<=(X+STR_X*3) THEN
  233. 2330     GET_DRW_MODE(1)=1
  234. 2340 ELSE IF (X+STR_X*3)<M_X AND M_X<=(X+STR_X*4) THEN
  235. 2350     GET_DRW_MODE(2)=1
  236. 2360 ELSE 
  237. 2370     RETURN
  238. 2380 ENDIF
  239. 2390 GOSUB *DRW_FLGS_RESET
  240. 2400 '
  241. 2410 FOR I=0 TO 2
  242. 2420     GET_DRW_MODE(I)=0
  243. 2430 NEXT I
  244. 2440 RETURN
  245. 2450 '
  246. 2460 '
  247. 2470 *DRW_FLGS_RESET
  248. 2480 FOR I=0 TO 2
  249. 2490   IF DRW_MODE(I)=1 AND GET_DRW_MODE(I)=0 THEN
  250. 2500      DRW_MODE(I)=0 : GOTO 2530
  251. 2510   ENDIF
  252. 2520    DRW_MODE(I)=(DRW_MODE(I) OR GET_DRW_MODE(I))
  253. 2530 NEXT I
  254. 2540 RETURN
  255. 2550 '
  256. 2560 '
  257. 2570 *SET_DRW_MODE
  258. 2580 FOR I=0 TO 2
  259. 2590   IF DRW_MODE(I)=1 THEN
  260. 2600     LINE (X+STR_X+STR_X*I,Y+STR_Y*2)-STEP(STR_X-1,STR_Y),PSET,,B
  261. 2610   ELSE
  262. 2620     LINE (X+STR_X+STR_X*I,Y+STR_Y*2)-STEP(STR_X-1,STR_Y),PRESET,,B
  263. 2630   ENDIF
  264. 2640 NEXT I
  265. 2650 RETURN
  266. 2660 '
  267. 2670 '
  268. 2680 '---LOOP_MODE ルーチン---
  269. 2690 '
  270. 2700 *CHK_SLCTD_LOOP
  271. 2710 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2) THEN
  272. 2720     GET_LOOP_MODE(0)=1
  273. 2730 ELSE IF (X+STR_X*3)<=M_X AND M_X<=(X+STR_X*4) THEN
  274. 2740     GET_LOOP_MODE(1)=1
  275. 2750 ELSE 
  276. 2760     RETURN
  277. 2770 ENDIF
  278. 2780 GOSUB *LOOP_FLGS_RESET
  279. 2790 '
  280. 2800 FOR I=0 TO 1
  281. 2810     GET_LOOP_MODE(I)=0
  282. 2820 NEXT I
  283. 2830 RETURN
  284. 2840 '
  285. 2850 '
  286. 2860 *LOOP_FLGS_RESET
  287. 2870 FOR I=0 TO 1
  288. 2880   IF LOOP_MODE(I)=1 AND GET_LOOP_MODE(I)=0 THEN
  289. 2890      LOOP_MODE(I)=0 : GOTO 2920
  290. 2900   ENDIF
  291. 2910    LOOP_MODE(I)=(LOOP_MODE(I) OR GET_LOOP_MODE(I))
  292. 2920 NEXT I
  293. 2930 RETURN
  294. 2940 '
  295. 2950 '
  296. 2960 *SET_LOOP_MODE
  297. 2970 FOR I=0 TO 1
  298. 2980   IF LOOP_MODE(I)=1 THEN
  299. 2990     LINE (X+STR_X+STR_X*2*I,Y+STR_Y*4)-STEP(STR_X,STR_Y),PSET,,B
  300. 3000   ELSE
  301. 3010     LINE (X+STR_X+STR_X*2*I,Y+STR_Y*4)-STEP(STR_X,STR_Y),PRESET,,B
  302. 3020   ENDIF
  303. 3030 NEXT I
  304. 3040 RETURN
  305. 3050 '
  306. 3060 '
  307. 3070 '---SND_MODE ルーチン---
  308. 3080 '
  309. 3090 *CHK_SLCTD_SND
  310. 3100 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2) THEN
  311. 3110     GET_SND_MODE(0)=1
  312. 3120 ELSE IF (X+STR_X*3)<=M_X AND M_X<=(X+STR_X*4) THEN
  313. 3130     GET_SND_MODE(1)=1
  314. 3140 ELSE 
  315. 3150     RETURN
  316. 3160 ENDIF
  317. 3170 GOSUB *SND_FLGS_RESET
  318. 3180 '
  319. 3190 FOR I=0 TO 1
  320. 3200     GET_SND_MODE(I)=0
  321. 3210 NEXT I
  322. 3220 RETURN
  323. 3230 '
  324. 3240 '
  325. 3250 *SND_FLGS_RESET
  326. 3260 FOR I=0 TO 1
  327. 3270   IF SND_MODE(I)=1 AND GET_SND_MODE(I)=0 THEN
  328. 3280      SND_MODE(I)=0 : GOTO 3310
  329. 3290   ENDIF
  330. 3300    SND_MODE(I)=(SND_MODE(I) OR GET_SND_MODE(I))
  331. 3310 NEXT I
  332. 3320 RETURN
  333. 3330 '
  334. 3340 '
  335. 3350 *SET_SND_MODE
  336. 3360 FOR I=0 TO 1
  337. 3370   IF SND_MODE(I)=1 THEN
  338. 3380     LINE (X+STR_X+STR_X*2*I,Y+STR_Y*6)-STEP(STR_X+8,STR_Y),PSET,,B
  339. 3390   ELSE
  340. 3400     LINE (X+STR_X+STR_X*2*I,Y+STR_Y*6)-STEP(STR_X+8,STR_Y),PRESET,,B
  341. 3410   ENDIF
  342. 3420 NEXT I
  343. 3430 RETURN
  344. 3440 '
  345. 3450 '
  346. 3460 '
  347. 3470 '***実行画面用のサブルーチン***
  348. 3480 '
  349. 3490 *MAIN_GRFC
  350. 3500 PLAY OFF
  351. 3510 PALETTE : SCREEN@ 0 : CLS  'メニュー画面を消す.(コンパイルするとパレットはそのまま. T_T)
  352. 3520 SCREEN 1,0,1,0 : CLS  'ページ0に切り換える.
  353. 3530 '
  354. 3540 IF SND_MODE(0) THEN
  355. 3550    PLAY ON
  356. 3560    PLAY "L1@16","L1@16","L1@16","L1@16"      '全音符で,音色をEP2.
  357. 3570 ENDIF
  358. 3580 '
  359. 3590 ON MOUSE(4) GOSUB *M_TRAP                '右クリックによる割り込みを定義.
  360. 3600 MOUSE(4) ON                 '右クリックの割り込みを許可.クリックするとRETURN.
  361. 3610 '
  362. 3620 IF SCRN_MODE(2) THEN
  363. 3630     GOSUB *DRW_32K : GOTO 4670
  364. 3640 ELSE IF SCRN_MODE(0) THEN
  365. 3650     COL=16 : SCREEN@ 0
  366. 3660 ELSE IF SCRN_MODE(1) THEN               'グラフィック2画面モードからは,
  367. 3670     COL=256 : SCREEN 0 : SCREEN@ 2      'SCREEN 0経由で256画面に移る.
  368. 3680 ENDIF
  369. 3690 '
  370. 3700 IF SCRN_MODE(0)=1 OR SCRN_MODE(1)=1 THEN
  371. 3710     DIM PLT_1(COL-1)             'パレット内容をコピーする配列.
  372. 3720     DIM PLT_2(COL-1)             '16/256画面のセーブのとき使う.
  373. 3730     DIM PLT_3(COL-1)
  374. 3740     DIM PLT_4(COL-1)
  375. 3750 ENDIF
  376. 3760 '
  377. 3770 IF SND_MODE(0) THEN       '4和音を容れるための配列を宣言。
  378. 3780     DIM TONE_1(COL-1)
  379. 3790     DIM TONE_2(COL-1)
  380. 3800     DIM TONE_3(COL-1)
  381. 3810     DIM TONE_4(COL-1)
  382. 3820 ENDIF
  383. 3830 '
  384. 3840 MOUSE 0 : MOUSE 4,640,0,641,0
  385. 3850 MOUSE 1,640,0,0   '256ではカーソルが表示されるので゙MOUSE4で制限.
  386. 3860 WHILE (1)     '無限ループ.右クリック割り込み or シングルモードのGOTOで脱出.
  387. 3870 '---ノイズモード---
  388. 3880 IF DRW_MODE(0) THEN       'DRW_MODEによる分岐をここから始める.
  389. 3890     GOSUB *RND_PLT
  390. 3900   FOR D_Y=0 TO 479
  391. 3910     FOR D_X=0 TO 639
  392. 3920       P=INT(RND*COL)
  393. 3930       PSET (D_X,D_Y),%P
  394. 3940 '
  395. 3950        IF SND_MODE(0) THEN
  396. 3960          IF D_X=0 AND (D_Y MOD 6=O) THEN
  397. 3970            SE_1$="N"+STR$(TONE_1(P))   '配列内の数値を文字列に
  398. 3980            SE_2$="N"+STR$(TONE_2(P))   '変換して,(MMLの)Nnの形式で
  399. 3990            SE_3$="N"+STR$(TONE_3(P))   '文字変数に代入.
  400. 4000            SE_4$="N"+STR$(TONE_4(P))
  401. 4010            PLAY SE_1$,SE_2$,SE_3$,SE_4$
  402. 4020          ENDIF
  403. 4030        ENDIF
  404. 4040     NEXT D_X
  405. 4050   NEXT D_Y
  406. 4060 '
  407. 4070   IF LOOP_MODE(1) THEN     'ループモードでなければ,ここから脱出.
  408. 4080       GOTO 4600
  409. 4090   ENDIF
  410. 4100 '
  411. 4110 '---タイルモード---
  412. 4120 ELSE IF DRW_MODE(1) THEN
  413. 4130     GOSUB *RND_PLT
  414. 4140   FOR D_Y=0 TO 464 STEP 16
  415. 4150     FOR D_X=0 TO 624 STEP 16
  416. 4160       P=INT(RND*COL)
  417. 4170       LINE (D_X,D_Y)-STEP(15,15),PSET,%P,BF
  418. 4180 '
  419. 4190      IF SND_MODE(0) THEN
  420. 4200        IF D_X=0 AND D_Y=0 THEN
  421. 4210             SE_1$="N"+STR$(TONE_1(P))   '配列内の数値を文字列に
  422. 4220             SE_2$="N"+STR$(TONE_2(P))   '変換して,(MMLの)Nnの形式で
  423. 4230             SE_3$="N"+STR$(TONE_3(P))   '文字変数に代入.
  424. 4240             SE_4$="N"+STR$(TONE_4(P))
  425. 4250             PLAY SE_1$,SE_2$,SE_3$,SE_4$
  426. 4260        ENDIF
  427. 4270      ENDIF
  428. 4280     NEXT D_X
  429. 4290      WAIT 4  'コンパイルすると早すぎるので.
  430. 4300   NEXT D_Y
  431. 4310 '
  432. 4320   IF LOOP_MODE(1) THEN
  433. 4330       GOTO 4600
  434. 4340   ENDIF
  435. 4350 '
  436. 4360 '---オープンモード---
  437. 4370 ELSE IF DRW_MODE(2) THEN
  438. 4380     GOSUB *RND_PLT : DEF PEN 0,3
  439. 4390     P=INT((RND*COL-1)+1) 'パレット0番を避けることにした.(16色だと真っ黒
  440. 4400                          'になっちゃうので.)
  441. 4410  IF SND_MODE(0) THEN
  442. 4420    SE_1$="N"+STR$(TONE_1(P))   '配列内の数値を文字列に
  443. 4430    SE_2$="N"+STR$(TONE_2(P))   '変換して,(MMLの)Nnの形式で
  444. 4440    SE_3$="N"+STR$(TONE_3(P))   '文字変数に代入.
  445. 4450    SE_4$="N"+STR$(TONE_4(P))
  446. 4460    PLAY SE_1$,SE_2$,SE_3$,SE_4$
  447. 4470  ENDIF
  448. 4480 '
  449. 4490   FOR D_Y=238 TO 0 STEP -3
  450. 4500     LINE (0,D_Y)-(639,479-D_Y),PSET,%P,B
  451. 4510   NEXT D_Y
  452. 4520 '
  453. 4530 DEF PEN 0,1
  454. 4540   IF LOOP_MODE(1) THEN
  455. 4550       GOTO 4600
  456. 4560   ENDIF
  457. 4570 ENDIF     'DRW_MODEによる分岐の終わり.
  458. 4580 WEND      '無限ループの終わり.
  459. 4590 '
  460. 4600 IF SCRN_MODE(1) THEN                  '256モードは1画面しか使えないので
  461. 4610     DIM TMP_256(153600)               '配列TMP_256に画面を保存する.
  462. 4620     GET@A (0,0)-(639,479),TMP_256     'セーブする場合必要になる.
  463. 4630     SCREEN@ 0                         '256画面からはSCREEN@ 0経由で
  464. 4640 ENDIF                                 'グラフィック2画面モードに戻る.
  465. 4650 '
  466. 4660 PLAY OFF
  467. 4670 MOUSE(4) OFF : RETURN   '***THE END OF *MAIN_GRFC***
  468. 4680 '
  469. 4690 '---ランダムパレットの作成 + ランダム和音の準備---
  470. 4700 *RND_PLT
  471. 4710 '
  472. 4720 FOR I=0 TO (COL-1)      'ランダムパレット作成
  473. 4730     G=INT(RND*256)
  474. 4740     R=INT(RND*256)
  475. 4750     B=INT(RND*256)
  476. 4760   PALETTE I,[G,R,B]
  477. 4770 '
  478. 4780     IF SCRN_MODE(0)=1 OR SCRN_MODE(1)=1 THEN'パレット内容をコピーしておく.
  479. 4790        PLT_1(I)=I
  480. 4800        PLT_2(I)=G
  481. 4810        PLT_3(I)=R
  482. 4820        PLT_4(I)=B
  483. 4830     ENDIF
  484. 4840 '
  485. 4850     IF SND_MODE(0) THEN          'パレット内容から音高を得る.
  486. 4860        TONE_1(I)=I MOD 33+44     '音高44-75の範囲(32音=約2オクターブ半)内
  487. 4870        TONE_2(I)=G MOD 33+44     'に,納めるための操作.
  488. 4880        TONE_3(I)=R MOD 33+44
  489. 4890        TONE_4(I)=B MOD 33+44
  490. 4900     ENDIF
  491. 4910 '
  492. 4920 NEXT I
  493. 4930 RETURN     '---*RND_PLTの終わり.---
  494. 4940 '
  495. 4950 '
  496. 4960 '---3万色モードのルーチン---
  497. 4970 *DRW_32K
  498. 4980 SCREEN@ 1 : MOUSE 1,,,0
  499. 4990 '
  500. 5000 WHILE (1)   '無限ループ.右クリック or シングルモードのRETURNで脱出.
  501. 5010 '---ノイズモード---
  502. 5020 IF DRW_MODE(0) THEN
  503. 5030     FOR D_Y=0 TO 239
  504. 5040       FOR D_X=0 TO 319
  505. 5050         GOSUB *RND_32K
  506. 5060         PSET (D_X,D_Y),[G*8,R*8,B*8]
  507. 5070 '
  508. 5080          IF SND_MODE(0) THEN
  509. 5090            IF (D_Y MOD 10)=0 AND D_X=0 THEN
  510. 5100              SE_1$="N"+STR$(G+44)   '(輝度(0-31)+基音高)を文字列に
  511. 5110              SE_2$="N"+STR$(R+44)   '変換して,(MMLの)Nnの形式で
  512. 5120              SE_3$="N"+STR$(B+44)   '文字変数に代入.
  513. 5130              PLAY SE_1$,SE_2$,SE_3$
  514. 5140            ENDIF
  515. 5150          ENDIF
  516. 5160 '
  517. 5170       NEXT D_X
  518. 5180     NEXT D_Y
  519. 5190 '
  520. 5200     IF LOOP_MODE(1) THEN
  521. 5210         RETURN
  522. 5220     ENDIF
  523. 5230 '
  524. 5240 '---タイルモード---
  525. 5250 ELSE IF DRW_MODE(1) THEN
  526. 5260     FOR D_Y=0 TO 224 STEP 16
  527. 5270       FOR D_X=0 TO 304 STEP 16
  528. 5280         GOSUB *RND_32K
  529. 5290         LINE (D_X,D_Y)-STEP(15,15),PSET,[G*8,R*8,B*8],BF
  530. 5300 '
  531. 5310          IF SND_MODE(0) THEN
  532. 5320            IF D_X=0 AND D_Y=0 THEN
  533. 5330               SE_1$="N"+STR$(G+44)   '(輝度(0-31)+基音高)を文字列に
  534. 5340               SE_2$="N"+STR$(R+44)   '変換して,(MMLの)Nnの形式で
  535. 5350               SE_3$="N"+STR$(B+44)   '文字変数に代入.
  536. 5360               PLAY SE_1$,SE_2$,SE_3$
  537. 5370            ENDIF
  538. 5380             WAIT 1
  539. 5390          ENDIF
  540. 5400 '
  541. 5410       NEXT D_X
  542. 5420     NEXT D_Y
  543. 5430 '
  544. 5440     IF LOOP_MODE(1) THEN
  545. 5450         RETURN
  546. 5460     ENDIF
  547. 5470 '
  548. 5480 '---オープンモード---
  549. 5490 ELSE IF DRW_MODE(2) THEN
  550. 5500   GOSUB *RND_32K
  551. 5510 '
  552. 5520   IF SND_MODE(0) THEN
  553. 5530     SE_1$="N"+STR$(G+44)   '(輝度(0-31)+基音高)を文字列に
  554. 5540     SE_2$="N"+STR$(R+44)   '変換して,(MMLの)Nnの形式で
  555. 5550     SE_3$="N"+STR$(B+44)   '文字変数に代入.
  556. 5560     PLAY SE_1$,SE_2$,SE_3$
  557. 5570   ENDIF
  558. 5580 '
  559. 5590   FOR D_Y=119 TO 0 STEP -1
  560. 5600     LINE (0,D_Y)-(319,239-D_Y),PSET,[G*8,R*8,B*8],B : WAIT 3
  561. 5610   NEXT D_Y
  562. 5620 '
  563. 5630   IF LOOP_MODE(1) THEN
  564. 5640       RETURN
  565. 5650   ENDIF
  566. 5660 ENDIF     'DRW_MODEによる分岐の終わり.
  567. 5670 WEND      '無限ループの終わり.
  568. 5680 RETURN    '---*DRW_32Kの終わり.---
  569. 5690 '
  570. 5700 '---3万色用ランダムカラー生成---
  571. 5710 *RND_32K
  572. 5720 MOUSE(4) ON   'ここでも許可しないと割り込まない場合がある(T_T)
  573. 5730 G=INT(RND*32) '処理がキツすぎるのかも・・・・
  574. 5740 R=INT(RND*32)
  575. 5750 B=INT(RND*32)
  576. 5760 RETURN     '---*RND_32Kの終わり.---
  577. 5770 '
  578. 5780 '
  579. 5790 '
  580. 5800 '***セーブするかどうかを選択する画面のルーチン***
  581. 5810 '
  582. 5820 *SELECT_SAVE
  583. 5830 '
  584. 5840 PLAY OFF
  585. 5850 IF SCRN_MODE(2)=0 THEN            '32Kモードでは配列を宣言していない.
  586. 5860   IF SND_MODE(0) THEN
  587. 5870     ERASE TONE_1,TONE_2,TONE_3,TONE_4
  588. 5880   ENDIF
  589. 5890 ENDIF
  590. 5900 '
  591. 5910 IF SCRN_MODE(0)=1 OR SCRN_MODE(2)=1 THEN  '16/32K画面を保存する配列
  592. 5920   DIM TMP(76800)                          'を宣言.
  593. 5930 ENDIF
  594. 5940 '
  595. 5950 SCREEN 0   'これがないとコンパイルした時パレットが初期化されない.
  596. 5960 SCREEN 1,1,3,1          'ページ1をアクティブにして両画面表示.
  597. 5970 SCREEN@ 0
  598. 5980 VIEW (255,207)-(383,271),7       '画面のほぼ中央に,
  599. 5990 WINDOW (0,0)-STEP(127,63)        '128×64のウィンドウを描画.
  600. 6000 '
  601. 6010 SYMBOL (7,7),"SAVE しますか?",1,1,1
  602. 6020 SYMBOL STEP(0,32),"SAVE!",1,1,2
  603. 6030 SYMBOL STEP(72,0),"EXIT!",1,1,1
  604. 6040 '
  605. 6050 MOUSE 0,1 : MOUSE 1,318,254,1   '"SAVE!"と"EXIT!"の中間にカーソルを表示.
  606. 6060 MOUSE 4,262,246,374,262           'カーソル移動範囲を,選択範囲内に限定.
  607. 6070 '
  608. 6080 SAVE_FLAG=0       '選択判定のフラグ.
  609. 6090 '
  610. 6100 WHILE SAVE_FLAG=0
  611. 6110   WHILE MOUSE(3,0)=0
  612. 6120   WEND                'おなぢみ(^^)
  613. 6130 '
  614. 6140   M_X=MOUSE(4,0)      '今回は,Y座標はMOUSE 4で限定されているので無用.
  615. 6150 '
  616. 6160   IF 262<=M_X AND M_X<=302 THEN          '選択開始!
  617. 6170     SAVE_FLAG=1
  618. 6180   ELSE IF 334<=M_X AND M_X<=374 THEN
  619. 6190     SAVE_FLAG=2
  620. 6200   ENDIF
  621. 6210 '
  622. 6220   M_X=0
  623. 6230 WEND               '選択判定の終わり.
  624. 6240 '
  625. 6250 '
  626. 6260 IF SAVE_FLAG=1 THEN
  627. 6270   SCREEN 1,0                   'ページ0をアクティブにする.
  628. 6280   IF SCRN_MODE(0) THEN         '16/32K画面を配列に保存.
  629. 6290     GET@A (0,0)-(639,479),TMP
  630. 6300   ELSE IF SCRN_MODE(2) THEN
  631. 6310     GET@A (0,0)-(319,239),TMP
  632. 6320   ENDIF
  633. 6330 '
  634. 6340   GOSUB *GO_SAVE   'セーブ画面へ.
  635. 6350 ENDIF
  636. 6360 '
  637. 6370 MOUSE(4) OFF
  638. 6380 '
  639. 6390 IF SCRN_MODE(0)=1 OR SCRN_MODE(2)=1 THEN   '不要になった配列を消去.
  640. 6400   ERASE TMP
  641. 6410 ELSE IF SCRN_MODE(1) THEN
  642. 6420   ERASE TMP_256
  643. 6430 ENDIF
  644. 6440 '
  645. 6450 IF SCRN_MODE(0)=1 OR SCRN_MODE(1)=1 THEN
  646. 6460   ERASE PLT_1,PLT_2,PLT_3,PLT_4
  647. 6470 ENDIF
  648. 6480 '
  649. 6490 SAVE_FLAG=0  '念のため.
  650. 6500 SCREEN@ 0 : VIEW : WINDOW : CLS
  651. 6510 RETURN 800     '*SETTING_MENUに直接戻るとエラーが出るので行番号で戻る.
  652. 6520 '
  653. 6530 '
  654. 6540 '***セーブ実行***
  655. 6550 '
  656. 6560 *GO_SAVE
  657. 6570 SCREEN 1,0,0
  658. 6580   IF SCRN_MODE(2)=0 THEN   '32K色はパレットが無い.
  659. 6590     PALETTE                '初期化しないと背景色が残り,
  660. 6600   ENDIF                    '文字が見にくい場合がある.
  661. 6610 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
  662. 6620 CONSOLE 3,21,2
  663. 6630 '
  664. 6640 LOCATE 0,0,0
  665. 6650 PRINT "    画像をファイルにSAVEします."
  666. 6660 PRINT "    マウスの右クリックの後,RETURNでキャンセルできます."
  667. 6670 '
  668. 6680 MOUSE 0 : MOUSE 4,640,0,641,0'←コンパイルするとカーソルが消えないので(T_T). 
  669. 6690 MOUSE 1,640,0,0
  670. 6700 ON MOUSE(4) GOSUB *M_TRAP_2
  671. 6710 MOUSE(4) ON
  672. 6720 LOCATE 0,3,1
  673. 6730 '
  674. 6740 PRINT
  675. 6750 PRINT "ディレクトリの内容を確認しますか? [Y / N]"
  676. 6760 '
  677. 6770 GET_KY$=INPUT$(1)
  678. 6780 IF GET_KY$="N" OR GET_KY$="n" THEN
  679. 6790   GOTO *GET_FILE_NAME
  680. 6800 ELSE IF GET_KY$="Y" OR GET_KY$="y" THEN
  681. 6810   PRINT "確認したいディレクトリのパス名を入力してください."
  682. 6820   PRINT "省略すると,カレントディレクトリを表示します."
  683. 6830     LINE INPUT ">",PATH_NAME$
  684. 6840     FILES PATH_NAME$
  685. 6850   GOTO 6740 
  686. 6860 ELSE
  687. 6870   GOTO 6740
  688. 6880 ENDIF
  689. 6890 '
  690. 6900 *GET_FILE_NAME   '←これはサブルーチンぢゃなくて単なるラベル.
  691. 6910 PRINT
  692. 6920 PRINT "SAVEするファイル名を";
  693. 6930 COLOR 3,,,4 : PRINT "フルパス";
  694. 6940 COLOR 7,,,0 : PRINT "で入力してください.拡張子はTIFのみです."
  695. 6950 PRINT "パス名を省略すると,カレントディレクトリにセーブします."
  696. 6960 LINE INPUT ">",F_NAME$
  697. 6970 '
  698. 6980 PRINT "圧縮しますか? [Y / N]"
  699. 6990 GET_KY$=INPUT$ (1)
  700. 7000 IF GET_KY$="Y" OR GET_KY$="y" THEN
  701. 7010   ASHK=1
  702. 7020 ELSE IF GET_KY$="N" OR GET_KY$="n" THEN
  703. 7030   ASHK=0
  704. 7040 ELSE
  705. 7050   GOTO 6980
  706. 7060 ENDIF
  707. 7070 '
  708. 7080 PRINT "SAVE します." : WAIT 100 : CLS
  709. 7090 '
  710. 7100 SAVE_FLG=1   'エラー発生箇所特定用フラグ.
  711. 7110 IF SCRN_MODE(0) THEN
  712. 7120   SCREEN@ 0 : GOSUB *RE_PLT
  713. 7130   PUT@A (0,0)-(639,479),TMP
  714. 7140   SAVE@ F_NAME$,(0,0)-(639,479),1,ASHK
  715. 7150 ELSE IF SCRN_MODE(1) THEN
  716. 7160   SCREEN@ 2 : GOSUB *RE_PLT
  717. 7170   PUT@A (0,0)-(639,479),TMP_256
  718. 7180   SAVE@ F_NAME$,(0,0)-(639,479),1,ASHK
  719. 7190 ELSE IF SCRN_MODE(2) THEN
  720. 7200   SCREEN@ 1
  721. 7210   PUT@A (0,0)-(319,239),TMP
  722. 7220   SAVE@ F_NAME$,(0,0)-(319,239),0,ASHK
  723. 7230 ENDIF
  724. 7240 SAVE_FLG=0
  725. 7250 '
  726. 7260 SYMBOL (0,0),"SAVE しました!",2,2,7,,,17 '見にくい時もあるが妥協(T_T)
  727. 7270 WAIT 150
  728. 7280 SCREEN@ 0 : MOUSE(4) OFF
  729. 7290 RETURN
  730. 7300 '
  731. 7310 *RE_PLT   'パレットを復元する.
  732. 7320 FOR I=0 TO COL-1
  733. 7330   PALETTE PLT_1(I),[PLT_2(I),PLT_3(I),PLT_4(I)]
  734. 7340 NEXT I
  735. 7350 RETURN
  736. 7360 '
  737. 7370 '
  738. 7380 '***メインメニューのパレットを初期化***
  739. 7390 '
  740. 7400 *RND_PLT_2
  741. 7410 GG=INT(RND*224+32)    '輝度32以上を,ランダムに得る.
  742. 7420 RR=INT(RND*223+32)
  743. 7430 BB=INT(RND*224+32)
  744. 7440 RETURN
  745. 7450 '
  746. 7460 *INIT_MENU_PLT
  747. 7470 PALETTE 0 ,[0,0,0]
  748. 7480 '
  749. 7490 FOR I=1 TO 14      'パレット番号1-14をランダムな色にする.
  750. 7500   GOSUB *RND_PLT_2
  751. 7510   PALETTE I ,[GG,RR,BB]
  752. 7520 NEXT I
  753. 7530 '
  754. 7540 PALETTE 15 ,[255,255,255]
  755. 7550 RETURN
  756. 7560 '
  757. 7570 '
  758. 7580 '***エンディング***
  759. 7590 *ENDING
  760. 7600 PLAY OFF:PLAY ON
  761. 7610 PLAY "T93V5@119L2","V5@119L2","V5@119L2","V5@119L2","V5@119L2" 'Vibe2.
  762. 7620 SCREEN@ 0 : CLS : COLOR 7,0,7,0
  763. 7630 SCREEN 1,0,3                    'ページ0を32Kモードに.
  764. 7640 SCREEN@ 1 : COLOR ,7 : CLS      '背景色を白でCLS.
  765. 7650 MOUSE(4) OFF : ON MOUSE(4) GOSUB *M_TRAP_3
  766. 7660 MOUSE 0 : MOUSE 4,320,0,321,0'←コンパイルするとカーソルが消えないので(T_T). 
  767. 7670 MOUSE 1,,,0 : MOUSE(4) ON
  768. 7680 DMY=MOUSE (4,1)   'MOUSE(3,1)を初期化するためダミーを使う.
  769. 7690 '
  770. 7700 '
  771. 7710     L_CNT=0 : M_CNT=0           'ループ回数と,BGMを鳴らした回数.
  772. 7720 WHILE MOUSE (3,1)=0
  773. 7730 '
  774. 7740  IF L_CNT>9 AND M_CNT>3 AND PLAY(0)=0 THEN
  775. 7750    GOTO 7910
  776. 7760  ENDIF
  777. 7770 '
  778. 7780     WHILE PLAY(0)=0
  779. 7790       GOSUB *E_BGM : M_CNT=M_CNT+1
  780. 7800     WEND
  781. 7810 '
  782. 7820       FOR Y=0 TO 224 STEP 16
  783. 7830         FOR X=0 TO 304 STEP 16
  784. 7840           GOSUB *RND_32K
  785. 7850           LINE (X,Y)-(X+15,Y+15),AND,[G*8,R*8,B*8],BF : WAIT 1
  786. 7860         NEXT X
  787. 7870       NEXT Y
  788. 7880         L_CNT=L_CNT+1
  789. 7890 WEND
  790. 7900 '
  791. 7910   PLAY OFF : PLAY ON
  792. 7920   PLAY "O5@63L1"     'Watglassの音で全音符.
  793. 7930 '
  794. 7940   COLOR 7,0 :CLS
  795. 7950   SCREEN 1,1  'ページ1をアクティブ.
  796. 7960     SYMBOL (242,240), "KANNO-HANADZI / 1994",1,.5!
  797. 7970   SCREEN 1,0,3
  798. 7980     GOSUB *RND_PLT_2
  799. 7990     WAIT 80
  800. 8000 '
  801. 8010   PLAY "C+"
  802. 8020   SYMBOL (153,136),"*",1,1,[GG,RR,BB] : WAIT 150
  803. 8030 '
  804. 8040 COLOR ,0 : CLS : SCREEN 1,1,0 : CLS
  805. 8050 RETURN
  806. 8060 '
  807. 8070 '
  808. 8080 '
  809. 8090 '***エラー処理***
  810. 8100 '
  811. 8110 *ERR_TRAP
  812. 8120 IF ERR=63 AND LOAD_FMB_FLG=1 THEN
  813. 8130   PRINT "このプログラムはFM音源ファイルFMP.FMBが必要です."
  814. 8140   PRINT "実行プログラムと同じディレクトリにFMP.FMBをコピーしてください."
  815. 8150   WAIT 500
  816. 8160   PRINT "Towns MENU に戻ります." : RESUME *ALL_END
  817. 8170 '
  818. 8180 ELSE IF ERR=63 THEN                         'ディレクトリ内確認の際のエラー.
  819. 8190   PRINT "指定のディレクトリにはファイルが存在しないようです."
  820. 8200   RESUME 6740                  '再びディレクトリ内容を確認するのか尋ねる.
  821. 8210 '
  822. 8220 ELSE IF ERR=60 OR ERR=72 THEN
  823. 8230   PRINT "指定の入出力装置は使用できません."
  824. 8240   PRINT "指定のドライブは正しく接続されていますか?"
  825. 8250   PRINT "フロッピーディスクは挿入されていますか?"
  826. 8260   RESUME 6740
  827. 8270 '
  828. 8280 ELSE IF ERR=53 THEN
  829. 8290   PRINT "入出力装置に異常が発生しました."
  830. 8300   PRINT "フロッピーディスク等を交換してみてください."
  831. 8310   PRINT "フロッピーディスク等はフォーマットされていますか?."
  832. 8320   RESUME 6740
  833. 8330 '
  834. 8340 ELSE IF ERR=64 THEN
  835. 8350  IF SCRN_MODE(2)=0 THEN   '32K色はパレットが無い.
  836. 8360    PALETTE                '初期化しないと背景色が残り,
  837. 8370  ENDIF                    '文字が見にくい場合がある.
  838. 8380   SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
  839. 8390 '
  840. 8400  PRINT "指定のファイルはすでに存在しています."
  841. 8410  PRINT "上書きしてもいいですか? [Y / N]"
  842. 8420  GET_KY$=INPUT$ (1)
  843. 8430   IF GET_KY$="Y" OR GET_KY$="y" THEN
  844. 8440     KILL F_NAME$
  845. 8450     RESUME 7080    'セーブのやり直し.
  846. 8460   ELSE
  847. 8470     LINE INPUT "別のファイル名をフルパスで指定してください. >",F_NAME$
  848. 8480     RESUME 7080
  849. 8490   ENDIF 
  850. 8500 '
  851. 8510 ELSE IF ERR=65 OR ERR=67 THEN
  852. 8520   IF SCRN_MODE(2)=0 THEN
  853. 8530     PALETTE
  854. 8540   ENDIF
  855. 8550   SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
  856. 8560 '
  857. 8570   PRINT "指定のディレクトリに空き領域がありません."
  858. 8580   PRINT "不要なファイルを削除するか,別のディレクトリにセーブしてください."
  859. 8590   PRINT
  860. 8600   PRINT "注意!"
  861. 8610   PRINT "上記にもかかわらず,指定したディレクトリ内に,指定したファイル名で"
  862. 8620   PRINT "書き込まれている場合があります.確認してみてください."
  863. 8630   PRINT "そのファイルは";
  864. 8640   COLOR 3,,,4 : PRINT "TIF形式ファイルではない,変なファイル";
  865. 8650   COLOR 7,,,0 : PRINT "です."
  866. 8660   PRINT "削除しちゃってください(^^;)"
  867. 8670   RESUME 6740
  868. 8680 '
  869. 8690 ELSE IF ERR=73 THEN
  870. 8700   IF SCRN_MODE(2)=0 THEN
  871. 8710     PALETTE
  872. 8720   ENDIF
  873. 8730   SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
  874. 8740 '
  875. 8750   PRINT "指定されたディスクは書き込みが禁止されています."
  876. 8760   RESUME 6740
  877. 8770 '
  878. 8780 ELSE IF (ERR=2 AND SAVE_FLG=1) OR (ERR=5 AND SAVE_FLG=1) THEN
  879. 8790 'ERR 2はインタプリタ,ERR 5はコンパイルしたもので出る,ようだ.
  880. 8800   IF SCRN_MODE(2)=0 THEN
  881. 8810     PALETTE
  882. 8820   ENDIF
  883. 8830   SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
  884. 8840 '
  885. 8850   PRINT "ファイル名が正しくない可能性があります."
  886. 8860   PRINT "もう一度正確にフルパスで入力してみてください."
  887. 8870   RESUME 6740
  888. 8880 '
  889. 8890 ELSE IF ERR=55 THEN
  890. 8900   IF SCRN_MODE(2)=0 THEN
  891. 8910     PALETTE
  892. 8920   ENDIF
  893. 8930   SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
  894. 8940 '
  895. 8950   PRINT "ファイル名が正しくありません."
  896. 8960   PRINT "もう一度正確にフルパスで入力してみてください."
  897. 8970   RESUME 6740
  898. 8980 '
  899. 8990 ELSE
  900. 9000   IF SCRN_MODE(2)=0 THEN
  901. 9010     PALETTE
  902. 9020   ENDIF
  903. 9030   SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
  904. 9040 '
  905. 9050   PRINT "何らかのエラーが発生しました."
  906. 9060   PRINT "エラー番号=";ERR
  907. 9070   PRINT "行番号=";ERL
  908. 9080   WAIT 500
  909. 9090   PRINT "Towns MENU に戻ります. すみません. m(_ _)m"
  910. 9100   RESUME *ALL_END
  911. 9110 ENDIF
  912. 9120 '
  913. 9130 '---エラー処理の終わり---
  914. 9140 '
  915. 9150 '
  916. 9160 '***BGM関連ルーチン***
  917. 9170 '
  918. 9180 '---メニュー用BGM---
  919. 9190 *M_BGM_SET                  '急いで考えたんで変数の使い方が変(T_T).
  920. 9200 M$(0)="L16B->FB->CQ3FGRFQ8R2"
  921. 9210 M$(1)="<<A>EA>CQ3FGRFQ8R2"
  922. 9220 M$(2)="<<G>DGB->Q3FGRFQ8R2"
  923. 9230 M$(3)="<<F>CFGA>C8Q3ERFRGRQ8AR8<<"
  924. 9240 '
  925. 9250 MELO$=M$(0)+M$(1)+M$(2)
  926. 9260 '
  927. 9270 M$(4)=MELO$+M$(3)
  928. 9280 M$(5)=MELO$+"<<F>CFGA>C8Q3ERFRGQ8<<"
  929. 9290 M$(6)=MELO$+"<<F>CFGA>C8Q3EQ8<<"
  930. 9300 M$(7)=MELO$+"<<F>CFG<"
  931. 9310 '
  932. 9320 PLAY "T100@118%C","@118%LV6","@118%RV4","@118%LV2"  'Marimba2の音.
  933. 9330 RETURN
  934. 9340 '
  935. 9350 '
  936. 9360 *M_BGM
  937. 9370     PLAY M$(4),"R4"+M$(5),"R2"+M$(6),"R2R4"+M$(7)
  938. 9380 RETURN
  939. 9390 '
  940. 9400 '
  941. 9410 '---エンディング用BGM---
  942. 9420 '
  943. 9430 *E_BGM
  944. 9440 '
  945. 9450 PLAY "DC<AB-&B-1>",">DC<AB-&B-1",">FECD&D1<",">B-AEF&F1<",">>FECD&D1<<"
  946. 9460 RETURN
  947. 9470 '
  948. 9480 '
  949. 9490 '
  950. 9500 '---マウス右クリック割り込みルーチン---
  951. 9510 *M_TRAP               '実行画面での割り込み発生で,ここに来る.
  952. 9520 RETURN 4600           '*MAIN_GRFCの終わりに戻る=*MAIN_GRFCを脱出する.
  953. 9530 '
  954. 9540 *M_TRAP_2             'セーブ画面での割り込みで,ここに来る.
  955. 9550 RETURN 6370           '*SELECT_SAVEの終わりに戻る=メインメニューへ戻る.
  956. 9560 '
  957. 9570 *M_TRAP_3             'エンディングをキャンセルする場合,ここに来る.
  958. 9580 RETURN 8040
  959. 9590 '
  960. 9600 '
  961. 9610 '
  962. 9620 '====================THE END OF PROGRAM==============================
  963. 9630 '
  964. 9640 '
  965. 9650 '
  966. 9660 '
  967. 9670 '********************************************************************
  968. 9680 '
  969. 9690 ' ・今回のプログラミングにおける教訓!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  970. 9700 '
  971. 9710 ' ・いろんな画面モードを切り換えて使う場合は,画面遷移に関して常に
  972. 9720 '  意識的でないとあかん!
  973. 9730 '
  974. 9740 ' ・256モード画面とグラフィック2画面モードは,直接行き来できない!
  975. 9750 '  256 > SCREEN@ 0 > 2画面
  976. 9760 '  2画面 > SCREEN 0 > 256
  977. 9770 '
  978. 9780 ' ・パレットを確実に初期化したい場合は, "SCREEN 0 : SCREEN@ 0" で行う!
  979. 9790 '  インタプリタは見逃してくれてもコンパイラはキビシー!(単に,私の頭が未熟者だ
  980. 9800 '  とゆー可能性もある. T_T)
  981. 9810 '
  982. 9820 ' ・PLAY命令は,きっちり管理しないとマウス割り込みに影響があるようだ.
  983. 9830 '  (ちがうかもしれない・・・)
  984. 9840 '
  985. 9850 ' ・SCREEN 関連の命令の前に,PLAY命令(のテンポとかオクターブの設定部分?)を
  986. 9860 '  置かないと,発音が遅れるよーだ.(他のことが原因かもしれないが・・・)
  987. 9870 '
  988. 9880 ' ・MOUSE (3,*)命令は,MOUSE 0 では初期化されない(らしい).
  989. 9890 '  (MOUSE (4,*) or MOUSE (5,*)で初期化できる.)
  990. 9900 '
  991. 9910 ' ・MOUSE 1 でカーソルを表示しないように設定しても,コンパイラは無視する(ようだ)
  992. 9920 '
  993. 9930 ' ・フラグ等のチェックは"WHILE"より"IF"を使うべき!
  994. 9940 '  (WHILEだと"GOTO"とかでループから強制脱出するしかない(ようだ ^^;).)
  995. 9950 '
  996. 9960 ' ・ファイルディスクリプタの記述は,カレントディレクトリから読み込みたい場合は "\"を
  997. 9970 '  先頭に付けてはいけない.(音源ファイルの読み込み等)
  998. 9980 '
  999. 9990 ' *まあ,こんなとこですかね. でわ.
  1000. 10000 '
  1001. 10010 '
  1002. 10020 '
  1003. 10030 '====================================================================
  1004.